home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Rozne / HTTrack 3.40-2 / httrack-3.40-2.exe / {app} / src_win / WinHTTrack / EasyDropTarget.cpp < prev    next >
C/C++ Source or Header  |  2004-06-20  |  7KB  |  301 lines

  1. /*
  2.   Implementation example:
  3.   
  4.   1. In the .h file: add
  5.  
  6. #include "EasyDropTarget.h"
  7. ...
  8. private: 
  9.   CEasyDropTarget* drag;
  10. ...
  11.   // Generated message map functions
  12.   afx_msg LRESULT DragDropText(WPARAM wParam,LPARAM lParam);
  13. ...
  14.  
  15.   2. In the cpp file: add
  16.  
  17. #include "EasyDropTarget.h"
  18. ...
  19. #define wm_CEasyDropTargetCallback (WM_USER + 1)
  20. BEGIN_MESSAGE_MAP(Wid1, CDialog)
  21. ...
  22.   ON_MESSAGE( wm_CEasyDropTargetCallback, DragDropText)
  23. ...
  24. END_MESSAGE_MAP()
  25.  
  26.  
  27. ...
  28. int CMyDialogClass::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  29. ...
  30.   // Drag&Drop
  31.   drag=new CEasyDropTarget(this);
  32.   if (drag->IsRegistered()) {
  33.     drag->SetTextCallback(wm_CEasyDropTargetCallback);
  34.   }
  35. ...
  36. }
  37.  
  38.   2b. Add the callback function
  39.  
  40. // Message from CEasyDropTarget
  41. LRESULT CMyDialogClass::DragDropText(WPARAM wParam,LPARAM lParam) {
  42.   if (lParam) {
  43.     CString st=*((CString*) lParam);
  44.     CLIPFORMAT cfFormat=wParam;
  45.     if (cfFormat==CF_TEXT)
  46.       AfxMessageBox("Raw text : "+st);
  47.     else if (cfFormat==CF_HDROP)
  48.       AfxMessageBox("File list (dropped) : "+st);
  49.     else
  50.       AfxMessageBox("Unknown source : "+st);
  51.   }
  52.   return 0;
  53. }
  54.  
  55.  
  56.  
  57.  
  58. */
  59.  
  60. // CEasyDropTarget.cpp : implementation file
  61. //
  62.  
  63. #include "stdafx.h"
  64. #include "Shell.h"
  65. #include "EasyDropTarget.h"
  66. #include <afxole.h>
  67.  
  68. #ifdef _DEBUG
  69. #define new DEBUG_NEW
  70. #undef THIS_FILE
  71. static char THIS_FILE[] = __FILE__;
  72. #endif
  73.  
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CEasyDropTarget
  76. CEasyDropTarget::CEasyDropTarget() {
  77.   this->registered=false;
  78.   //
  79.   this->wnd=NULL;
  80.   this->cedt_text=0;
  81. }
  82.  
  83. CEasyDropTarget::CEasyDropTarget(CWnd* wnd) {
  84.   this->wnd=wnd;
  85.   if (this->wnd) {
  86.     if (Register(this->wnd)) {
  87.       registered=true;
  88.     }
  89.   }
  90. }
  91.  
  92. void CEasyDropTarget::SetTextCallback(UINT fnc) {
  93.   cedt_text=fnc;
  94. }
  95.  
  96. BOOL CEasyDropTarget::IsRegistered() {
  97.   return registered;
  98. }
  99.  
  100.  
  101. /////////////////////////////////////////////////////////////////////////////
  102. // CEasyDropTarget - tools functions
  103. // Convert a String to char** (each lines in each char*)
  104. // Return: NULL if error, else a char** (last char* item is NULL)
  105. char** CEasyDropTarget::StringToArray(CString st) {
  106.   char** tab;
  107.   int i;
  108.   int n=2;                        // one line, + null term
  109.   for(i=0;i<st.GetLength();i++)
  110.     if (st[i]=='\n')
  111.       n++;
  112.   tab=(char**) calloc(n,sizeof(char*));
  113.   if (tab) {
  114.     char* buff=(char*) malloc(st.GetLength()+2);
  115.     if (buff) {
  116.       int index=0;
  117.       buff[st.GetLength()]='\0';        // NULL at the end of buff for last line
  118.       tab[index++]=(char*) buff;
  119.       for(i=0;i<st.GetLength();i++) {
  120.         if (st[i]=='\n') {              // next line (next char*)
  121.           buff[i]='\0';
  122.           tab[index++]=(char*) buff+i+1;  // note: avoid \n\r or else there may be problems (empty lines)
  123.         } else if (st[i]=='\r') {     // ignore \r
  124.           buff[i]='\0';
  125.         } else
  126.           buff[i]=st[i];
  127.       }
  128.       tab[index++]=(char*) NULL;
  129.       return tab;
  130.     } else
  131.       free(tab);
  132.   }
  133.   return (char**) NULL;
  134. }
  135. int CEasyDropTarget::ReleaseStringToArray(char** st) {
  136.   free((void*) st[0]);  // char buffer
  137.   free((void*) st);     // char* buffer
  138.   return 1;
  139. }
  140.  
  141.  
  142. /////////////////////////////////////////////////////////////////////////////
  143. // CEasyDropTarget - Drag&Drop functions
  144. void CEasyDropTarget::SendWndText(CString DroppedData,CLIPFORMAT cfFormat) {
  145.   if (wnd) {
  146.     if (this->cedt_text) {
  147.       wnd->SendMessage(this->cedt_text,cfFormat,(long) &DroppedData);      // Send Message
  148.     }
  149.   }
  150. }
  151.  
  152.  
  153. /////////////////////////////////////////////////////////////////////////////
  154. // CEasyDropTarget - Drag&Drop general functions
  155.  
  156. DROPEFFECT CEasyDropTarget::OnDragScroll( CWnd* pWnd, DWORD dwKeyState, CPoint point ) 
  157. {     
  158.     return DROPEFFECT_NONE; 
  159.  
  160. DROPEFFECT CEasyDropTarget::OnDragOver( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point ) 
  161.     return DROPEFFECT_COPY; 
  162.  
  163. DROPEFFECT CEasyDropTarget::OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point ) 
  164.   return DROPEFFECT_COPY; 
  165.  
  166. BOOL CEasyDropTarget::OnDrop( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point ) 
  167.   COleDataObject *MyObject = pDataObject;  
  168.   CString DroppedData;
  169.   int ntype=DataToString(pDataObject,DroppedData);
  170.   if (ntype) {
  171.     SendWndText(DroppedData,ntype);
  172.   }
  173.   return TRUE; 
  174.  
  175. int CEasyDropTarget::DataToString(COleDataObject* pDataObject,CString &DroppedData) 
  176.   COleDataObject *MyObject = pDataObject; 
  177.   
  178.   // get file refering to clipboard data
  179.   if (pDataObject->IsDataAvailable(CF_TEXT)) {
  180.     CFile *pFile = pDataObject->GetFileData(CF_TEXT);
  181.     if (pFile != NULL) {
  182.       // connect the file to the archive and read the contents
  183.       CArchive ar(pFile, CArchive::load);
  184.       DroppedData=DoImportText(ar);
  185.       ar.Close();
  186.       delete pFile;                   // desalloc
  187.       return CF_TEXT;
  188.     }
  189.   }
  190.   else if (pDataObject->IsDataAvailable(CF_HDROP)) {
  191.     STGMEDIUM StgMedium;
  192.     if (pDataObject->GetData(CF_HDROP, &StgMedium)) {
  193.       if (StgMedium.tymed==TYMED_HGLOBAL) {
  194.         HGLOBAL hGlobal = (HGLOBAL) StgMedium.hGlobal;
  195.         HDROP hDropInfo = (HDROP) hGlobal;
  196.         DroppedData=DoImportFile(hDropInfo);
  197.       }
  198.       ReleaseStgMedium(&StgMedium);        // desalloc
  199.       return CF_HDROP;
  200.     }
  201.   }
  202.   return -1;
  203.  
  204. CString CEasyDropTarget::DoImportText(CArchive &ar)
  205. {
  206.   char szNode[256];
  207.   CString st="";  
  208.   while (ReadString(ar, szNode, sizeof(szNode)) != NULL)
  209.   {
  210.     int cch = strlen(szNode);
  211.     if (cch) {
  212.       szNode[cch] = '\0';
  213.     }
  214.     if (st.GetLength())
  215.       st+="\r\n";
  216.     st+=szNode;
  217.   }
  218.   return st;  
  219. }
  220.  
  221. CString CEasyDropTarget::DoImportFile(HDROP hDropInfo)
  222. {
  223.   CString st="";
  224.   int nf;
  225.   int i;
  226.   nf=DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);    // nb of files
  227.   for(i=0;i<nf;i++) {
  228.     char* buff;
  229.     int size;
  230.     size=DragQueryFile(hDropInfo,i,NULL,0);    // buffer size
  231.     if (size>0) {
  232.       size+=16;    // marge de sΘcuritΘ
  233.       buff=(char*) calloc(size,1);
  234.       if (buff) {
  235.         if (DragQueryFile(hDropInfo,i,buff,size)>0) {    // ok copied
  236.           if (st.GetLength())
  237.             st+="\r\n";
  238.           st+=buff;
  239.         }
  240.         free(buff);
  241.       }
  242.     }
  243.   }
  244.   return st;
  245. }
  246.  
  247.  
  248.  
  249. static int ReadString(CArchive& ar, char* pString, int nMaxLen)
  250. {
  251.     int nCount = 0;
  252.     char ch;
  253.     pString[nCount] = (char)0;
  254.     TRY
  255.     {
  256.         do
  257.         {
  258.             ar >> (BYTE&)ch;
  259.  
  260.             // watch out for ^Z (EOF under DOS)
  261.             if (ch == 0x1A)
  262.                 break;
  263.  
  264.             // combine "\r\n" pair into single "\n"
  265.             if (ch == '\n' && nCount != 0 && pString[nCount-1] == '\r')
  266.                 nCount--;
  267.  
  268.             pString[nCount++] = ch;
  269.  
  270.         } while (nCount < nMaxLen-1 && ch != '\n');
  271.     }
  272.     END_TRY
  273.  
  274. #ifdef _OLD
  275.     // insert newline if missing
  276.     if (nCount != 0 && pString[nCount-1] != '\n' && nCount < nMaxLen-1)
  277.         pString[nCount++] = '\n';
  278.     pString[nCount] = (char)0;
  279. #else
  280.     // insert newline if missing
  281.     if (nCount != 0 && pString[nCount-1] != '\n' && nCount < nMaxLen-1)
  282.     {
  283.         if (pString[nCount-1] == '\0')
  284.             pString[nCount-1] = '\n';
  285.         else
  286.             pString[nCount++] = '\n';
  287.     }
  288.     pString[nCount] = (char)0;
  289. #endif
  290.     return nCount;
  291. }
  292.